package com.zyq.pagehelper.service;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.zyq.pagehelper.entity.User;
import com.zyq.pagehelper.mapper.UserMapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;

@Service
public class UserService {

    @Resource
    UserMapper UserMapper;

    /**
     * 获取用户集合
     * @param user   封装好条件的user类
     * @param pageNo    第几页
     * @param pageSize   每页显示的长度
     * @return
     */
    public PageInfo<User> getUserList(User user, int pageNo, int pageSize){
        //设置分页信息： 查询的页码，每页的数据量//true表示需要统计总数
        //这样会多进行一次请求select count(0);
        //统计总数，(只对简单SQL语句其效果，复杂SQL语句需要自己写）
        Page<?> page=PageHelper.startPage(pageNo,pageSize,true);
        System.out.printf("数据总数:"+page.getTotal());
        List<User> userList= UserMapper.getUserList(user);//根据user中的数据作为查询条件
        PageInfo<User> pageInfo=new PageInfo<User>(userList);//将List数据封装为PageInfo对象
        return  pageInfo;
    }

    //PageHelper的其他API：
    //tring orderBy = PageHelper.getOrderBy();    //获取orderBy语句
    //    Page<?> page = PageHelper.startPage(Object params);
    //    Page<?> page = PageHelper.startPage(int pageNum, int pageSize);
    //    Page<?> page = PageHelper.startPage(int pageNum, int pageSize, boolean isCount);
    //    Page<?> page = PageHelper.startPage(pageNum, pageSize, orderBy);
    //    Page<?> page = PageHelper.startPage(pageNum, pageSize, isCount, isReasonable);
    //    isReasonable分页合理化,null时用默认配置
    //    Page<?> page = PageHelper.startPage(pageNum, pageSize, isCount, isReasonable, isPageSizeZero);
    // isPageSizeZero是否支持PageSize为0，true且pageSize=0时返回全部结果，false时分页,null时用默认配置

    //默认值：
    //RowBounds参数offset作为PageNum使用 - 默认不使用
    //private boolean offsetAsPageNum = false;
    //    //RowBounds是否进行count查询 - 默认不查询
    //    private boolean rowBoundsWithCount = false;
    //    //当设置为true的时候，如果pagesize设置为0（或RowBounds的limit=0），就不执行分页，返回全部结果
    //    private boolean pageSizeZero = false;
    //    //分页合理化
    //    private boolean reasonable = false;
    //    //是否支持接口参数来传递分页参数，默认false
    //    private boolean supportMethodsArguments = false;

    //PageHelper线程 安全问题：
    //PageHelper 方法使用了静态的 ThreadLocal 参数，分页参数和线程是绑定的。
    //1.如果你写出下面这样的代码，就是不安全的用法：
    //PageHelper.startPage(1, 10);
    //List<Country> list;
    //if(param1 != null){
    //    list = countryMapper.selectIf(param1);
    //} else {
    //    list = new ArrayList<Country>();
    //}
    //这种情况下由于 param1 存在 null 的情况，就会导致 PageHelper 生产了一个分页参数，但是没有被消费，这个参数就会一直保留在这个线程上。当这个线程再次被使用时，就可能导致不该分页的方法去消费这个分页参数，这就产生了莫名其妙的分页。
    //
    //2.上面这个代码，应该写成下面这个样子：
    //List<Country> list;
    //if(param1 != null){
    //    PageHelper.startPage(1, 10);
    //    list = countryMapper.selectIf(param1);
    //} else {
    //    list = new ArrayList<Country>();
    //}
    //这种写法就能保证安全。

    //3.如果你对此不放心，你可以手动清理 ThreadLocal 存储的分页参数，可以像下面这样使用：
    //
    //List<Country> list;
    //if(param1 != null){
    //    PageHelper.startPage(1, 10);
    //    try{
    //        list = countryMapper.selectAll();
    //    } finally {
    //        PageHelper.clearPage();
    //    }
    //} else {
    //    list = new ArrayList<Country>();
    //}
    //这么写很不好看，而且没有必要。

}
